﻿using System;
using System.Collections.Generic;
using System.Data.Entity;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace DAO.Repositories
{
    public class BaseRepository<T> : IDao<T> where T : class  
    {
        internal DbSet<T> dbSet;

        DeployAppEntities _dbModel;
        public BaseRepository(DeployAppEntities dbModel)
        {
            _dbModel = dbModel;
            dbSet = dbModel.Set<T>();
        }

        public void Add(T entity)
        {
            if (entity == null)
                throw new ArgumentNullException("entity");
            dbSet.Add(entity);
        }

        public void Delete(int id)
        {
            var entity = dbSet.Find(id);
            if (entity == null)
                throw new InvalidOperationException("Произошла ошшибка при удалении объекта операции. Не найден объект с таким идентификатором.");
            dbSet.Remove(entity);
        }

        public void Edit(T entity)
        {
            if (entity == null)
                throw new ArgumentNullException("entity");
            var pKey = dbSet.Create().GetType().GetProperty("id").GetValue(entity);
            var oldEntity = dbSet.Find(pKey);
            _dbModel.Entry<T>(oldEntity).CurrentValues.SetValues(entity);
        }

        public IEnumerable<T> GetAll()
        {
            return dbSet.AsEnumerable<T>();
        }

        public T GetById(int id)
        {
            return dbSet.Find(id);
        }
    }
}
